﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.core.DataModel;
using System.Data.Linq;
using condortravel.operaciones.entities.Entities;

namespace condortravel.operaciones.persistence.tourImpl
{
    public class RecursosSolicitadoDAOImpl : condortravel.operaciones.persistence.Impl.GenericDAO<Tb_RecursosSolicitados, int>
    {
        #region Custom Methods

        public List<Tb_RecursosSolicitados> getListRecursosSolicitadosGuiasByTour(FilterRecursosSolicitadosCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_Detalle_Tour);
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_TipoGuia);
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_Estado_Tour);
                    options.LoadWith<Tb_Detalle_Tour>(s => s.Tb_Tour);
                    options.LoadWith<Tb_Detalle_Tour>(s => s.Tb_Detalle_PaqueteProgramado);

                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_RecursosSolicitados>()
                                where p.tipoRecurso == short.Parse("1")
                                      && p.Tb_Detalle_Tour.tour_ID == filter.Tour_ID
                            select p).ToList<Tb_RecursosSolicitados>();
                }
            }
        }


        public List<Tb_RecursosSolicitados> getListRecursosSolicitadosTrasladosByTour(FilterRecursosSolicitadosCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_Detalle_Tour);
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_Estado_Tour);
                    options.LoadWith<Tb_Detalle_Tour>(s => s.Tb_Tour);
                    options.LoadWith<Tb_Detalle_Tour>(s => s.Tb_Detalle_PaqueteProgramado);

                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_RecursosSolicitados>()
                            where p.tipoRecurso == short.Parse("2")
                                  && p.Tb_Detalle_Tour.tour_ID == filter.Tour_ID
                            select p).ToList<Tb_RecursosSolicitados>();
                }
            }
        }


        #endregion


        public Tb_RecursosSolicitados updateEstado(Tb_RecursosSolicitados entity)
        {
            Tb_RecursosSolicitados bean;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    bean = dataContext.GetTable<Tb_RecursosSolicitados>().Where(
                            p => p.recursoSolicitado_ID == entity.recursoSolicitado_ID).SingleOrDefault<Tb_RecursosSolicitados>();
                    bean.estadoRecursoSolicitado = entity.estadoRecursoSolicitado;
                    dataContext.SubmitChanges();
                }
            }
            return bean;
        }


        #region CRUD
        public override Tb_RecursosSolicitados update(Tb_RecursosSolicitados entity)
        {
            return null;
            /*Tb_Incidencia incidencia;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    incidencia = dataContext.GetTable<Tb_Incidencia>().Where(p => p.incidente_ID == entity.incidente_ID).Single();
                    incidencia.agente_ID = entity.agente_ID;
                    incidencia.categoria_ID = entity.categoria_ID;
                    incidencia.ciudad_ID = entity.ciudad_ID;
                    incidencia.cliente_ID = entity.cliente_ID;
                    incidencia.descripcionIncidente = entity.descripcionIncidente;
                    incidencia.descripcionSolucion = entity.descripcionSolucion;
                    incidencia.estado_Incidencia_ID = entity.estado_Incidencia_ID;
                    incidencia.fechaAtencion = entity.fechaAtencion;
                    //incidencia.fechaRegistro = entity.fechaRegistro;
                    incidencia.grupoAsignacion_ID = entity.grupoAsignacion_ID;
                    incidencia.pais_ID = entity.pais_ID;
                    incidencia.paqueteTuristico_ID = entity.paqueteTuristico_ID;
                    incidencia.prioridad_ID = entity.prioridad_ID;
                    incidencia.programacion_ID = entity.programacion_ID;
                    incidencia.resultado_ID = entity.resultado_ID;
                    incidencia.tipoProblema_ID = entity.tipoProblema_ID;
                    incidencia.agencia_ID = entity.agencia_ID;
                    incidencia.subcategoria_ID=entity.subcategoria_ID;
                    dataContext.SubmitChanges();
                }
            }
            return incidencia;*/
        }

        public override Tb_RecursosSolicitados getByID(int id)
        {
           
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = new DataContext(this.ConnectionString))
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_RecursosSolicitados>(s => s.Tb_Detalle_Tour);
                    options.LoadWith<Tb_Detalle_Tour>(s => s.Tb_Tour);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_RecursosSolicitados>()
                            where p.recursoSolicitado_ID == id
                            select p).SingleOrDefault<Tb_RecursosSolicitados>();
                }
            }
            
        }

        public override void delete(int pk)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
